package main

import "fmt"

func calc(index string,a,b int)int{
	ret:=a+b
	fmt.Println(index,a,b,ret)
	return ret
}
func main()  {
	a:=1
	b:=2
	defer calc("1",a,calc("10",a,b))
	//先输出后面的calc的值 10,1,2,3
	//后输出前面的calc的值 1,1,1+2,1+3

	a=0
	defer calc("2",a,calc("20",a,b))
	//后面calc的值：20,0,2,2
	//前面的calc的值：2,0,2,2
}

/*
答：首先要知道defer是在代码最后一行return之前执行的，本着先进后出的原则执行
程序执行到第13行，会先执行defer calc代码段中b段的代码，因为b段的代码不是defer，和LIFO没关系 。所以必须先执行。
输出结果是10,1,2,3,然后将结果存到延迟执行队列defer中
程序向下执行，当执行到第18行的时候，程序也是先把行参数b中的代码，
输出结果：20,0,2,2,将执行结果存到defer延迟中。

接下来开始执行defer代码。按照先进后出的原则执行。
所以输出结果为
2 0 2 2
1 1 3 4
*/